package com.qfmy.common.utils;

import com.qfmy.core.constant.DateConstants;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @ClassName: DateTimeUtils
 * @author： zhengjt
 * @data： 2022/3/14 20:32
 * @version：1.0
 * @描述： 时间工具类
 */
public class DateTimeUtils {

    public static void main(String[] args) {
        getNowTime();
    }

    /**
     * @param now        当前时间
     * @param beforeDate 前一天
     */
    public static void checkTask(Date now, Calendar beforeDate) {
        //1、获取当前时间（不需要）

        //2、前一天 = 当前时间-1（不需要）
        beforeDate.add(Calendar.DAY_OF_MONTH, -1);

        //3、Integer count = sql查询 count(*) 条件 状态时间 = 前一天 and status = SUCCESS
        Integer count = 0;

        //4、判断count 是否 > 0 ，
        if (count > 0) {
            //5、1)如果大于0 即代表前一天有执行任务
            //      判断 前一天+1 是否等于今天
            //      如果是 { break/return  ;}
            //      如果不是 前一天 +1 执行task任务
            //
            beforeDate.add(Calendar.DAY_OF_MONTH, +1);
            if (compareTime(now,beforeDate.getTime())){
                //执行sql 整合清单  时间 = beforeDate.getTime()
                //执行完该天后 在此检查任务
                checkTask(now,beforeDate);
            }else {

                return;
            }

        }else {
            //5、2）如果小于 0 （代表前一天任务未执行 ）
            //          前一天 -1
            //          checkTask（ 前一天 ， 前一天-1）
            //
            checkTask(now,beforeDate);
        }

    }

    /**
     * @return
     */
    public static String getNowTime() {
        //设置时间格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //获取当前时间
        Date date = new Date();

        Calendar today = Calendar.getInstance();
        today.setTime(date);

        System.out.println(sdf.format(today.getTime()));

        today.add(Calendar.DAY_OF_MONTH, -1);


        System.out.println(today.getTime());

        System.out.println(sdf.format(today.getTime()));

        //compareTo
        //前者大于后者 返回1
        //前者小于后者 返回-1
        //前者等于后者 返回0

        if (compareTime(date, today.getTime())) {
            today.add(Calendar.DAY_OF_MONTH, +1);
            System.out.println("比较后的时间  " + sdf.format(today.getTime()));
        }

        return null;
    }

    /**
     * 比较时间
     * otherDay大于today 返回1
     * otherDay小于today 返回-1
     * otherDay等于today 返回0
     *
     * @param today
     * @param otherDay
     * @return otherDay小于today
     * today >= otherDay
     * return true else return false
     */
    public static boolean compareTime(Date today, Date otherDay) {

        Integer compareTime = otherDay.compareTo(today);

        if (compareTime < 0) {
            return true;
        }

        return false;
    }


    /**
     * String转Date
     *
     * @param dateStr
     * @return
     */
    public static Date strToDate(String dateStr) {
        if (dateStr == null) {
            return null;
        }
//        //初始问题版
//        for (String datePattern : DateConstants.DATE_LIST) {
//            try {
//                SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);
//
//                Date date = simpleDateFormat.parse(dateStr);
//                return date;
//            } catch (ParseException e) {
//                    e.printStackTrace();
//            }
//        }
        //尝试修正版
        /*
            目前存在的问题：
                1、能够捕获到异常，但因没有打印，所以暂时没发现，但不知是否会影响到其他程序的运行。
                2、如何精准判断格式
         */
        //使用循环，自定获取对应格式进行转换
        for (String datePattern : DateConstants.DATE_LIST) {
            //  通过长度判断对应的类型
            if (datePattern.length() == dateStr.length()){
                try {
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);
                    Date date = simpleDateFormat.parse(dateStr);
                    return date;
                } catch (ParseException e) {
//                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    /**
     * 通过格式将string 转换成 date
     * @param str   需要转换的String
     * @param pattern   String的格式 例如 ： yyyyMMdd
     * @return  Date
     */
    public static Date strToDateByPattern(String str, String pattern){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        Date date = null;
        try {
            date = simpleDateFormat.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * date 转 String
     *
     * @param date 需要转换的Date
     * @param pattern 需要转换的格式
     * @return 转换后的date String字符串
     */
    public static String dateToStr(Date date, String pattern) {

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd");
        if (StringUtils.isNotEmpty(pattern)){
            simpleDateFormat = new SimpleDateFormat(pattern);
        }

        return simpleDateFormat.format(date);
    }

    /**
     * date 转 String
     *
     * @param date 需要转换的Date
     * @return 转换后的date String字符串
     */
    public static String dateToStr(Date date) {
        String pattern = "yyy-MM-dd";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

        String dateString = simpleDateFormat.format(date);

        return dateString;
    }

    /**
     * 获取当前时间
     * @return  当前时间字符串 yyyy-MM-dd HH:mm:ss
     */
    public static String getNowDate(){
        Date date = new Date();
        String now = dateToStr(date,DateConstants.DATE_TIME);
        return now;
    }

    /**
     * 获取当前年
     * @return  当前年
     */
    public static String getYear(){
        Date date = new Date();
        String now = dateToStr(date,DateConstants.YEAR);
        return now;
    }

    /**
     * 获取当前月
     * @return  当前月
     */
    public static String getMonth(){
        Date date = new Date();
        String now = dateToStr(date,DateConstants.MONTH);
        return now;
    }

    /**
     * 获取当前日
     * @return  当前日
     */
    public static String getDay(){
        Date date = new Date();
        String now = dateToStr(date,DateConstants.DAY);
        return now;
    }

    /**
     * 得到一个时间延后或前移几天的时间
     *
     * @param nowdate
     *            当前时间
     * @param delay
     *            前移或后延的天数
     * @return
     */
    public static Date getNextDay(Date nowdate, int delay) {
        try {
            long myTime = (nowdate.getTime() / 1000) + delay * 24
                    * 60 * 60;
            nowdate.setTime(myTime * 1000);
            return nowdate;
        } catch (Exception e) {
            return null;
        }
    }


}
